package lambda表达式;


import java.util.Arrays;

public class lambda {
    public static void main(String[] args) {
//        原始写法
        new student() {
            @Override
            public void play() {
                System.out.println("play");
            }
        }.play();
//        特别要注意,lambda只能简化函数式接口的写法,也就是一个接口里只有一个函数
//        第一次简化
//        lambda的基本写法就是留下形参列表,然后用箭头指向一个函数体
      接口2 函数式接口1=  ()-> {
                System.out.println("play");
        };
//      参数列表里的参数类型可以省略
      接口3 函数式接口2=  (a)-> {
          System.out.println("play");
      };
//      只有一个参数的时候小括号可以省略
      接口3 函数式接口3= a-> {
          System.out.println("play");
      };
//      如果函数只有一行,大括号也可以省略,如果有return语句,return也可以省略
      接口3 函数式接口4= a-> System.out.println("play");
//      既然lambda只能简化函数式接口,那不就说明函数式接口需要只一个特定的函数就行了吗
//        正好如果有一个形参列表和返回值都相同的静态函数,那就可以直接把这个函数传入进去
        接口3 函数式接口5= 阿巴阿巴::play;
        函数式接口5.play(3);
//        如果这个方法不是静态方法也可以先创建这个方法所属的对象
//        再用同样的步骤简化lambda
        阿巴阿巴 阿巴 = new 阿巴阿巴();
        接口3 函数式接口6= 阿巴::play2;
        String[] names= {"aav","ergaer","Gib"};
        Arrays.sort(names, (s1, s2) -> s1.compareToIgnoreCase(s2));
//        下面这种简化简直变态
//        对于上面这里自定义排序来说
//        如果lambda只是调用一个实例方法,而且参数列表中的第一个参数是作为方法的主调
//        后面的所有参数都是作为该实例方法的入参的,这时候就可以用特定类型的方法引用
        Arrays.sort(names, String::compareToIgnoreCase);
    }
}
